package com.lx.dao;

import com.lx.entity.BankCard;
import com.lx.entity.Trade;
import com.lx.entity.vo.BankCardAndUserInfo;
import com.lx.entity.vo.TradeAndCardInfoVO;

import java.sql.SQLException;
import java.util.List;

/**
 * @title: BankCardDao
 * @projectName bankManage
 * @description: TODO
 * @author: yuanChu
 * @date: 2022/5/6  8:35
 */
public interface BankCardDao {
    Integer addBankCard(BankCard bankCard) throws SQLException;

    /**
     * 根据银行卡号查询在数据库中的条数
     *
     * @param cardId 要查询的银行卡卡号
     * @return 查询到的数量
     * @throws SQLException sql查询异常
     */
    int findCardCountById(String cardId) throws SQLException;

    /**
     * 根据银行卡卡号查询银行卡信息以及关联用户信息
     *
     * @param cardId 要查询的银行卡卡号
     * @return 银行卡对象与持卡人姓名的关联对象
     * @throws SQLException sql查询异常
     */
    BankCardAndUserInfo findCardInfoById(String cardId) throws SQLException;

    /**
     * 根据用户Id查询名下的所有银行卡信息
     *
     * @param userId 要查询的用户Id
     * @return 银行卡列表
     * @throws SQLException sql查询异常
     */
    List<BankCard> findCardsByUserId(Integer userId) throws SQLException;


    /**
     * 给给定的银行卡扣除指定的金额
     *
     * @param cardId     要扣款的银行卡
     * @param transMoney 要扣除的金额
     * @return 是否扣除成功
     * @throws SQLException sql查询异常
     */
    boolean charge(String cardId, Double transMoney) throws SQLException;


    /**
     * 给指定的银行卡加钱
     *
     * @param payeeCard  要加钱的银行卡卡号
     * @param transMoney 要加的金额
     * @return 是否加钱成功
     * @throws SQLException sql查询异常
     */
    boolean addMoney(String payeeCard, Double transMoney) throws SQLException;

    /**
     * 插入一条交易记录
     *
     * @param trade 交易记录的所有信息
     * @return 是否插入成功
     * @throws SQLException sql查询异常
     */
    boolean insert(Trade trade) throws SQLException;

    /**
     * 根据卡号查余额
     *
     * @param cardId
     * @return
     */
    List<BankCard> findBalanceById(String cardId) throws SQLException;


    /**
     * 存款
     *
     * @param trade 存款对象
     * @return 是否成功
     */
    boolean deposit(Trade trade) throws SQLException;

    /**
     * 给指定的银行卡扣钱
     *
     * @param cardId     要扣钱的银行卡卡号
     * @param withdrawal 要扣的金额
     * @return 是否扣钱成功
     * @throws SQLException sql查询异常
     */
    boolean withdrawal(String cardId, double withdrawal) throws SQLException;

    //冻结指定用户的银行卡
    Integer freeze(String cardId) throws SQLException;

    /**
     * 更改银行卡状态
     *
     * @param cardId
     * @return
     * @throws SQLException
     */
    Integer updateStatusByCardId(String cardId) throws SQLException;

    /**
     * 查询账户下所有的银行卡交易信息
     *
     * @param userId 用户ID
     * @return 该用户所有的银行卡交易信息
     * @throws SQLException sql查询异常
     */
    List<TradeAndCardInfoVO> getAccountLastMonthRecord(Integer userId) throws SQLException;

    /**
     * 查询某张卡的交易信息
     *
     * @param cardNo 卡号
     * @return 查询某张卡的交易信息
     * @throws SQLException sql查询异常
     */
    List<TradeAndCardInfoVO> selectLastMonthRecordByCard(String cardNo) throws SQLException;
}
